function verificarFugasPorExceso() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const hojaUsuarios = ss.getSheetByName("datos usuarios");
  const hojaRiegos = ss.getSheetByName("Hoja 1");
  const hojaLog = ss.getSheetByName("log_alertas") || ss.insertSheet("log_alertas");

  // Encabezado si es nuevo
  if (hojaLog.getLastRow() === 0) {
    hojaLog.appendRow(["Fecha", "Sensor", "Franja Horaria", "Tipo Alerta", "Litros", "Límite", "Correo enviado"]);
  }

  const zonaHoraria = Session.getScriptTimeZone();
  const hoy = new Date();
  const hoyStr = Utilities.formatDate(hoy, zonaHoraria, "yyyy-MM-dd");

  const usuarios = hojaUsuarios.getRange(2, 1, hojaUsuarios.getLastRow() - 1, 7).getValues();
  const riegosRaw = hojaRiegos.getRange(2, 2, hojaRiegos.getLastRow() - 1, 4).getValues();

  const sensoresInfo = {};
  usuarios.forEach(([sensor, , correo, , , , caudalEsperado]) => {
    if (sensor && correo && caudalEsperado) {
      sensoresInfo[sensor] = {
        correo,
        caudalEsperado: parseFloat(caudalEsperado),
        registros: [] // Guardamos todos los registros del día
      };
    }
  });

  // Agrupar datos válidos por sensor (solo los de hoy)
  riegosRaw.forEach(([fechaHoraRaw, sensor, , litros]) => {
    if (!sensoresInfo[sensor] || !litros || litros <= 0) return;

    const fechaRiego = new Date(fechaHoraRaw);
    if (isNaN(fechaRiego.getTime())) return;
    if (fechaRiego.toDateString() !== hoy.toDateString()) return;

    sensoresInfo[sensor].registros.push({ fecha: fechaRiego, litros });
  });

  // Cargar alertas anteriores
  const alertasYaEnviadas = new Set();
  const ultimaFilaLog = hojaLog.getLastRow();
  if (ultimaFilaLog > 1) {
    const datosLog = hojaLog.getRange(2, 1, ultimaFilaLog - 1, 4).getValues();
    for (const fila of datosLog) {
      let [fecha, sensor, franja, tipo] = fila;
      if (fecha && sensor && franja && tipo) {
        fecha = Utilities.formatDate(new Date(fecha), zonaHoraria, "yyyy-MM-dd");
        const clave = `${fecha}|${sensor}|${franja}|${tipo.trim()}`;
        alertasYaEnviadas.add(clave);
      }
    }
  }

  // Evaluar excesos por bloques de 3 registros
  for (const sensor in sensoresInfo) {
    const { correo, caudalEsperado, registros } = sensoresInfo[sensor];
    const maxLimite = caudalEsperado * 1.2;

    registros.sort((a, b) => a.fecha - b.fecha); // ordenar por hora

    const alertasParaLog = [];
    let mensaje = "";

    for (let i = 0; i <= registros.length - 3; i++) {
      const bloque = registros.slice(i, i + 3);
      const sumaLitros = bloque.reduce((sum, r) => sum + r.litros, 0);

      if (sumaLitros > maxLimite) {
        const horaInicio = Utilities.formatDate(bloque[0].fecha, zonaHoraria, "HH:mm");
        const horaFin = Utilities.formatDate(bloque[2].fecha, zonaHoraria, "HH:mm");
        const franja = `${horaInicio}-${horaFin}`;
        const clave = `${hoyStr}|${sensor}|${franja}|Exceso`;

        if (!alertasYaEnviadas.has(clave)) {
          mensaje += `⚠️ Exceso de caudal entre ${franja}: ${sumaLitros.toFixed(0)} L (límite: ${maxLimite.toFixed(0)} L)\n`;
          alertasParaLog.push([hoyStr, sensor, franja, "Exceso", sumaLitros, maxLimite.toFixed(0), "Sí"]);
        }
      }
    }

    if (alertasParaLog.length > 0) {
      hojaLog.getRange(hojaLog.getLastRow() + 1, 1, alertasParaLog.length, 7).setValues(alertasParaLog);

      MailApp.sendEmail({
        to: correo,
        subject: `🚨 Posible fuga – Sensor ${sensor}`,
        body: `Se detectaron excesos de caudal el día ${hoyStr}:\n\n${mensaje}`
      });
    }
  }

  Logger.log("Verificación de fugas por exceso completada.");
}